<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //ES3是没有办法阻止对象扩展的，定义对象后可以给对象添加新的属性
      //var obj = { name: 'John' }
      //添加一个属性 age
      //obj.age = 30
      //添加方法
      //obj.setAge = function (r) {
      // this.age = r
      //}
      //console.log(obj.age)

      //ES5的Object.preventExtensions则可以阻止给对象添加新的属性
      //var obj = { name: 'John' }
      //阻止对象扩展
      //Object.preventExtensions(obj)
      //添加新属性
      //obj.age = 30
      //测试性属性，是undefined,表名没有添加成功
      //console.log(obj.age)

      //isExtensible:判断一个对象是否可扩展，即是否可以添加新属性
      //默认普通的对象是可扩展的
      //let obj = {}
      //true 表示可扩展
      //Object.isExtensible(obj)

      //Object.seal:让一个对象密封，并返回被密封后的对象。
      //密封对象是指那些不能添加新的属性，不能删除已有属性，以及不能修改已有属性的可枚举性、可配置性、可写性，
      //但可以修改已有属性的值的对象。
      //添加新属性：
      let obj = { name: 'John' }
      //密封
      Object.seal(obj)
      //不能添加新属性
      obj.age = 30
      console.log(obj.age)

      //删除已有属性:
      delete obj.name
      console.log(obj.name)

      //修改已有属性的可枚举型，可配置型，可写性:
      //修改已有的配置属性
      // Object.defineProperty(obj, 'name', {
      //   configurable: true,
      //   writable: true,
      //   enumerable: true,
      // })

      //修改已有的属性
      obj.name = 'Backus'
      console.log(obj.name)
    </script>
  </body>
</html>
